package _10_Recursion;
/**
 * 练习题 : 
 *	需求 : 
 * 		传入一个数据,判断该数据在斐波那契数列的第几位上
 * 		如果不存在返回 -1  如果存在就返回对应的位数
 * 
 * 	思路 :
 *		1 需要提供一个方法,该方法用于获取每一位斐波那契数列的值
 *		2 提供一个需求对应的接口方法
 *			入参是 数据(参数列表)
 *			出参是 位数,如果不存在返回-1(返回值)
 *	功能 : 
 *			根据传入的数据,循环和每一位斐波那契数列的值进行比较
 *			如果比较成功,就返回对应的 位数 即可
 *		循环比较的终止条件 : 
 *			斐波那契数列是一个升序的数列
 *			如果该数大于前一位,小于后一位,说明不存在
 *			因为越后面值越大
 * @author lenovo
 * @Date 2020年6月29日
 * @Time 下午3:09:20
 */
public class Recursion_03 {

	public static void main(String[] args) {
		System.out.println(getIndex(5702887));
	}
	/**
	 * 提供一个需求对应的接口方法
	 * @param i
	 * @return
	 */
	public static long getIndex(long i) {
		if(i==1) {
			System.out.println("第一位和第二位的值都是1");
			return 2;
		}
		if (i < 1) {
			System.out.println("输入数据错误");
			return -1;
		}
		
		//到了这里说明一定是大于1的,也就是斐波那契数列的低三位,或者是不存在的
		for (int j = 3; true; j++) {
			//根据传入的数据,循环和每一位斐波那契数列的值进行比较
			//比较成功,就返回对应的位数即可
			if (i == getData(j)) {
				return j;
			}
			/**
			 * 循环比较的终止条件:
			 * 斐波那契数列是一个升序的数列
			 * 如果该数大于前一位,小于后一位,说明不存在
			 * 因为越后面值越大
			 */
			if (i < getData(j)) {
				return -1;
			}
		}
	}
	public static long getData(long i) {
		int a=1;
		int b=1;
		int c=0;
		for (int j = 3; j < i; j++) {
			c = a + b;
			a = b;
			b = c;
		}
		return c;
	}
}
